/**
 *  Classe que representa um Problema
 *  
 *  @file
 *  @version 1.0
 *
 *  
 *  @section Description
 *  Esta classe representa um Problema.
 */

#import <Foundation/Foundation.h>
#import "DataContext.h"
#import "Problems.h"
#import "Historys.h"
#import "Comments.h"
#import "Resources.h"
#import "History.h"
#import "Comment.h"
#import "Resource.h"
#import "Project.h"
#import "State.h"

@class Problems;
@class Historys;
@class Comments;
@class Resources;
@class History;
@class Comment;
@class Resource;
@class DataContext;
@class Project;
@class State;


/**
 Header para a classe Problem. Esta classe tem o objectivo de encapsular o objecto de acesso a dados Problems. 
 Toda a logica que for necessária de implmentar no objecto Problem, extra aquela que o gerador de código criou, deve ser feita nesta
 classe.
 */
@interface Problem : NSObject <DBInterface> {
	/**
	 Objecto de acesso a dados Problems. Este objecto tem toda a lógica a nível de acesso a dados para este objecto.
	 Tem também a capacidade de automaticamente criar os scripts SQL para efectuar pedidos a BD.
	 */
	Problems *problemsObject;
	
	/**
	 Coleçao de objectos Resource associados a esta Action. 
	 Esta coleçoes devem ser preenchidas com a ajuda da classe DataContext.
	 */
	@private NSMutableArray *resourceList;
	
	/**
	 Coleçao de objectos Comment associados a esta Action. 
	 Esta coleçoes devem ser preenchidas com a ajuda da classe DataContext.
	 */
	@private NSMutableArray *commentList;
	
	/**
	 Coleçao de objectos History associados a esta Action. 
	 Esta coleçoes devem ser preenchidas com a ajuda da classe DataContext.
	 */
	@private NSMutableArray *historyList;
	
	/**
	 Project state
	 */
	@private State *problemState;
	
	/**
	 Flag para marcar se o objecto foi alterado. 
	 */
	@private bool changed;
	
	/**
	 Flag para marcar se o objecto nao existe na BD. 
	 */
	@private bool isNew;
}

	/**
	 Propriedade com o objecto Problems.
	 */ 
@property (readwrite, assign) Problems * problemsObject;

	/**
	 Propriedade com os objectos Comment relacionados com este Project
	 */
@property (readwrite, assign) NSMutableArray *commentList;

	/**
	 Propriedade com os objectos Resource relacionados com este Project
	 */
@property (readwrite, assign) NSMutableArray *resourceList;

	/**
	 Propriedade com a coleçao de History's associada a este objecto.
	 */
@property (readonly)  NSMutableArray *historyList;

	/**
	 Project state
	 */
@property (readwrite, assign) State *problemState;
	
	/**
	Propriedade que indica se o objecto nao existe na BD.
	*/
@property (readwrite)  bool  isNew;

	/**
	Propriedade que indica se este objecto foi alterado desde que foi carregado da BD.
	*/
@property (readwrite)  bool  changed;

	/**
	Constructor com base num objecto Problems.
	@param pprojects Objecto Problems. 
	@return Instancia.
	*/
- (id) initWithProblems : (Problems *) problems;

	/**
	Constructor com base num objecto Project.
	@param pprojects Objecto Project. 
	@return Instancia.
	*/
- (id) initWithProject : (Project *) project;

	/**
	 @return Descriçao do problema.
	 */
- (NSString *) getProblemDescription;

	/**
	 @return Descriçao do impacto.
	 */
- (NSString *) getImpact_Description;

	/** 
	 @return Descriçao da resposta.
	 */
- (NSString *) getResponse_Description;

	/**
	 @return Owner da resposta.
	 */
- (NSString *) getResponseOwner;

	/**
	 @return Estado do problema.
	 */
- (NSString *) getProblemState;

	/**
	@return O tempo em segundos desde Janeiro de 1970 até ao valor de Response_Finish. 
	*/
- (double) getResponse_Finish;
	
	/**
	@return O tempo em segundos desde Janeiro de 1970 até ao valor de DateTimeCreated. 
	*/
- (double) getDateTimeCreated;
	
	/**
	 @return Retorna o identificador do problema.
	 */
- (int) getProblemId;

	/*! Retorna o Selector que permite alterar a data no valor de Response Finish Date. 
	 * @return Selector que permite alterar a data no valor Response Finish Date. 
	 */
- (SEL) getSetResponseFinishSelector;


- (void) setProblemDescription : (NSString *) desc;

- (void) setImpact_Description : (NSString *) ipm;

- (void) setResponse_Description : (NSString *) resp;


	/**
	 Metodo para carregar comentarios.
	 */
- (void) loadComments;

	/**
	Metodo para carregar recursos.
	*/
- (void) loadResources;

	/**
	Metodo para carregar historico.
	*/
- (void) loadHistory;

	/**
	Metodo para carregar o estado do problema.
	*/
- (void) loadState;

	/**
	 Metodo para descarregar comentarios.
	*/
- (void) unloadComments;

	/**
	Metodo para descarregar recursos.
	*/
- (void) unloadResources;

	/**
	Metodo para descarregar historico.
	*/
- (void) unloadHistory;
@end
